package com.nowcoder.topic.stack.middle;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;

/**
 * NC219 移掉 K 位数字
 * @author d3y1
 */
public class NC219 {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param num string字符串
     * @param k int整型
     * @return string字符串
     */
    public String removeKnums (String num, int k) {
        // return solution1(num, k);
        // return solution2(num, k);
        return solution3(num, k);
    }

    /**
     * 单调栈+贪心
     * @param num
     * @param k
     * @return
     */
    private String solution1(String num, int k){
        if(k >= num.length()){
            return "0";
        }

        Stack<Character> stack = new Stack<>();
        for(char digit: num.toCharArray()){
            // 单调栈(单调增)
            while(!stack.isEmpty() && digit<stack.peek() && k>0){
                // 贪心
                stack.pop();
                k--;
            }
            stack.push(digit);
        }

        // 继续移除
        while(k-- > 0){
            if(!stack.isEmpty()){
                stack.pop();
            }
        }

        // 保存结果
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.insert(0, stack.pop());
        }

        // 去掉前导0
        String result = sb.toString();
        if(result.startsWith("0")){
            int index;
            for(index=0; index<result.length(); index++){
                if(result.charAt(index) != '0'){
                    break;
                }
            }
            if(index < result.length()){
                result = result.substring(index);
            }else{
                result = "0";
            }
        }

        return result;
    }

    /**
     * 单调栈+贪心
     * @param num
     * @param k
     * @return
     */
    private String solution2(String num, int k){
        int n = num.length();
        if(k >= n){
            return "0";
        }

        Deque<Character> stack = new ArrayDeque<>();

        for(char ch: num.toCharArray()){
            // 单调栈(单调增)
            while(!stack.isEmpty() && stack.peekLast()>ch && k>0){
                // 贪心
                stack.pollLast();
                k--;
            }
            stack.offerLast(ch);
        }

        // 继续移除
        while(!stack.isEmpty() && k>0){
            stack.pollLast();
            k--;
        }

        // 去掉前导0
        while(!stack.isEmpty() && stack.peekFirst()=='0'){
            stack.pollFirst();
        }

        // 保存结果
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pollFirst());
        }

        return sb.length()==0?"0":sb.toString();
    }

    /**
     * 单调栈+贪心
     * @param num
     * @param k
     * @return
     */
    private String solution3(String num, int k){
        int n = num.length();
        if(k >= n){
            return "0";
        }

        Deque<Character> stack = new ArrayDeque<>();

        for(char ch: num.toCharArray()){
            // 单调栈(单调增)
            while(!stack.isEmpty() && stack.peekLast()>ch && k>0){
                // 贪心
                stack.pollLast();
                k--;
            }
            stack.offerLast(ch);
        }

        // 继续移除
        while(!stack.isEmpty() && k>0){
            stack.pollLast();
            k--;
        }

        // 保存结果
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pollFirst());
        }

        // 去掉前导0
        String result = sb.toString().replaceFirst("^0+", "");

        return "".equals(result)?"0":result;
    }
}